package poker;
import java.lang.reflect.Array;
// DeckOfCards é uma classe que representa um deque de cartas
import java.util.Random;

public class DeckOfCards {
	private Card deck[]; // array de cartas: Pilha
	private int currentCard; // índice da carta atual:TOPO da Pilha
	private final int NUMBER_OF_CARDS = 52; // total de cartas no deque : limite da Pilha
	private Random randomNumbers; // gerador de números pseudo-aleatórios

	// construtor do deque de cartas
	public DeckOfCards() {
		String faces[] = {"Dois", "Três", "Quatro", "Cinco", "Seis",
				"Sete", "Oito", "Nove", "Dez", "Valete", "Dama", "Rei", "Ás" };
		String suits[] = { "Paus", "Copas", "Espadas", "Ouros"};

		randomNumbers = new Random(); // instancia gerador de números aleatórios
		currentCard = 0; // carta atual é a primeira do deque

		/**Done: Inicializa o Deck de Cartas
		 * 
		 */
		this.deck = (Card[]) Array.newInstance(Card.class, NUMBER_OF_CARDS);
		/*SIMPLIFICANDO PERCORRER O VETOR E ATRIBUIR VALORES*/
		for(int i = 0; i < this.deck.length; i++){
				deck[i]= new Card(faces[i/4], suits[i%4]);
		}

	} // fim construtor

	/** método que embaralha as cartas
	 * @param void
	 * @return void
	 */
	public void shuffle() {

		currentCard = 0; // reinicializa carta atual do deque
		/**Done
		 * Embaralhe as cartas.         
		 * Dica: troque a carta corrente com uma posição aleatória do baralho.
		 * Passado vetor baralho é feito modificação em seus atributos, no caso 
		 * as cartas e suas disposições através do método random da classe Math 
		 * @author raphael
		 * @param DeckOfCards
		 * @return void
		 * */
		for (int first = 0; first < this.deck.length; first++) {
			int index = randomNumbers.nextInt(NUMBER_OF_CARDS);
			Card temp = this.deck[first];
			this.deck[index]=temp;
		}//fim do embaralhamento

	} // fim método shuffle

	/**Done
	 * Retorna uma carta do baralho, caso vazio retorna NULL
	 * @author raphael
	 * @param 
	 * @return
	 *  */
	public Card dealCard() {
		if(this.currentCard == this.NUMBER_OF_CARDS)
			return null;//acabou as cartas do baralho: pilha vazia
		else{
			
			++this.currentCard;//atualiza apontador de pilha
			return this.deck[this.currentCard-1];
		}	
	} // fim método dealCard
	/* 
	 *  Retorne uma mão (cinco cartas). */
	public Card[] dealHand(){
		if((this.currentCard - 5) == 0){
			return null;// Não possue cartas a serem retiradas, pilha insuficiente
		}
		/*Instancia vetor hand com cinco cartas*/
		Card[] mao = new Card[5];

		//else
		for(int i = 0; i < 5; i++) {
			mao[i]= this.deck[4*i+32];
		}
		this.currentCard=- 5;//atualiza apontador de pilha
		return mao;
		
	}
	/*Método GET para mostrar a carta corrente do BARALHO
	 * é utilizado aqui apenas como método de teste para saber como
	 * esta a pilha, sem modificar a visibilidade do atributo currentCard
	 * da classe DeckOfCards
	 *  
	 */
	public int GetCurrentCard(DeckOfCards baralho){
		return this.currentCard;
	}
		
} // fim classe DeckOfCards

